Skip to content

fix(tests): deux bancs du kiosque mesuraient l'ordonnanceur, pas le superviseur - #53

Merged
lostmind84 merged 1 commit into
mainfrom
fix/bancs-qui-mesurent-l-ordonnanceur
Aug 7, 2026
Merged

fix(tests): deux bancs du kiosque mesuraient l'ordonnanceur, pas le superviseur#53
lostmind84 merged 1 commit into
mainfrom
fix/bancs-qui-mesurent-l-ordonnanceur

Conversation

@lostmind84

Copy link
Copy Markdown
Owner

Ce qui a été relevé, pas deviné

Les 120 derniers runs de la CI : 15 échecs, dont cinq sur trois tests d''internal/kiosk entre le 30/07 et le 07/08/2026.

Test Fois Message
TestAStationThatDoesNotAnswerYetShowsTheWaitingPage 2 poste muet : ouvert sur "http://127.0.0.1:8085"
TestTheGraceIsBoundedAndEndsOnTheStartingPage 1 idem
TestTheWordingChangesOnceTheStationHasAnswered 2 page d''attente revenue après 3 s : le délai de grâce a été resservi

Deux causes, aucune dans le produit : les deux bancs mesuraient l''ordonnanceur.

Défaut A — le superviseur démarrait avant que le test ait choisi l''état du poste

newBench posait alive = true et lançait Run avant de rendre la main. Un test qui écrivait ensuite alive.Store(false) courait contre la première scrutation, qui est la première instruction du superviseur. Sur un runner assez chargé pour l''ordonnancer d''abord, il ouvrait l''écran client — et le message accusait le superviseur d''avoir ouvert sur un poste muet alors que le poste répondait encore à l''instant où il avait regardé.

Reproduit à l''identique en glissant time.Sleep(20 * time.Millisecond) entre les deux lignes.

L''état initial devient un constructeur et non un champ écrit après coup — newBenchOnAStationThatDoesNotAnswerYet — qui le pose avant Run, où aucune temporisation ne peut plus rien casser.

Défaut B — la boucle d''attente facturait la latence de l''hôte à l''horloge fausse

Le message était faux, et le code le prouve : awaitStation ne tourne qu''une fois, avant le premier navigateur, donc la grâce ne peut pas être resservie.

La vraie faute : nextLaunch avançait l''horloge fausse de 50 ms à chaque tour de boucle, y compris les tours passés à attendre que l''ordonnanceur exécute le superviseur. L''horloge fausse comptait donc la charge de la machine — et toutes les assertions de durée de ce fichier se lisent sur elle.

Mesuré en affamant la goroutine (GOMAXPROCS=1, passe -race) :

--- FAIL: TestTheWordingChangesOnceTheStationHasAnswered (0.11s)
    supervisor_test.go:329: page d'attente revenue après 1h50m39.45s : le délai de grâce a été resservi

1 h 50 de temps faux écoulées en 0,11 s de temps réel. Six chutes sur six.

L''horloge ne bouge désormais que si quelqu''un l''attend, ce que Clock.Pending() sait déjà dire ; et les trois tests de la grâce attendent explicitement que le superviseur soit garé dessus avant de la pousser, sans quoi la durée est distribuée alors que rien n''est inscrit pour la recevoir.

Vérification

Dans la condition qui faisait tomber : 50 exécutions du paquet à GOMAXPROCS=1 sous -race, toutes vertes, là où six sur six tombaient.

go test ./... vert sur 35 paquets, go vet et gofmt sans remarque.

Ce qui n''est PAS corrigé, et n''est pas à croire corrigé

TestACorruptedCatalogIsQuarantinedAgainstTheRealChain (internal/station) est tombé une fois le 31/07/2026 sur 0 ligne(s) ERR-CAT-03 en niveau erreur, attendu 1, et n''a pas été reproduit : 120 exécutions affamées, toutes vertes. L''explication d''une ligne technique encore en vol est faible — deux tours de boucle complets séparent le troisième refus de l''assertion. Il reste ouvert et n''a pas été touché : corriger sur une intuition aurait rendu le prochain signalement illisible.

Les trois autres échecs relevés sont groupés sur un seul run d''une branche de développement, ce qui ressemble à un travail en cours et non à une instabilité.

…uperviseur

Releve sur les 120 derniers runs de la CI : 15 echecs, dont cinq sur trois
tests d'internal/kiosk entre le 30/07 et le 07/08/2026. Deux causes, aucune
dans le produit.

A -- newBench posait alive = true ET demarrait le superviseur avant de rendre
la main. Un test qui ecrivait ensuite alive.Store(false) courait contre la
premiere scrutation, qui est la premiere instruction du superviseur : sur un
runner assez charge pour l'ordonnancer d'abord, il ouvrait l'ecran client, et
le message accusait le superviseur d'avoir ouvert sur un poste muet alors que
le poste repondait encore a l'instant ou il avait regarde. Reproduit a
l'identique en glissant un Sleep de 20 ms entre les deux lignes. L'etat
initial devient un constructeur -- newBenchOnAStationThatDoesNotAnswerYet --
qui le pose AVANT Run, ou aucune temporisation ne peut plus rien casser.

B -- nextLaunch avancait l'horloge fausse de 50 ms a chaque tour de boucle, y
compris les tours passes a attendre que l'ordonnanceur execute le superviseur.
L'horloge fausse comptait donc la charge de la machine, et toutes les
assertions de duree de ce fichier se lisent sur elle. Le message « le delai de
grace a ete resservi » etait faux : awaitStation ne tourne qu'une fois, avant
le premier navigateur. Mesure en affamant la goroutine (GOMAXPROCS=1, -race) :
six chutes sur six, dont une annoncant 1h50m de temps faux ecoule en 0,11 s de
temps reel. L'horloge ne bouge plus que si quelqu'un l'attend, ce que
Clock.Pending() sait deja dire, et les trois tests de la grace attendent que
le superviseur soit gare dessus avant de la pousser.

Verifie dans la condition qui faisait tomber : 50 executions du paquet a
GOMAXPROCS=1 sous -race, toutes vertes, la ou six sur six tombaient.

Ce qui n'est PAS corrige : TestACorruptedCatalogIsQuarantinedAgainstTheRealChain
est tombe une fois le 31/07 et n'a pas ete reproduit en 120 executions
affamees. Il reste ouvert et n'a pas ete touche.
@lostmind84
lostmind84 merged commit c34a468 into main Aug 7, 2026
14 of 16 checks passed
@lostmind84
lostmind84 deleted the fix/bancs-qui-mesurent-l-ordonnanceur branch August 7, 2026 16:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant